from rest_framework import serializers

from apps.goods.models import SKUImage,SKU

class SKUImageModelSerializer(serializers.ModelSerializer):
    """图片序列化器"""
    sku = serializers.PrimaryKeyRelatedField(queryset=SKU.objects.all())
    
    class Meta:
        model = SKUImage
        fields = '__all__'
        
    def to_representation(self, instance):
        """重写此方法以自定义图片URL的表示方式"""
        data = super().to_representation(instance)
        
        # 确保image字段使用正确的URL
        if 'image' in data and data['image']:
            # 如果image字段已经是完整URL，直接使用
            if data['image'].startswith('http'):
                # 如果是127.0.0.1的URL，替换为正确的FastDFS URL
                if '127.0.0.1:8000' in data['image']:
                    from django.conf import settings
                    # 提取FastDFS文件路径部分
                    path = data['image'].split('group1')[-1]
                    if not path.startswith('/'):
                        path = '/' + path
                    # 构建正确的URL
                    data['image'] = settings.FDFS_BASE_URL.rstrip('/') + '/group1' + path
            # 如果不是完整URL，构建完整URL
            else:
                from django.conf import settings
                if not data['image'].startswith('/'):
                    data['image'] = '/' + data['image']
                data['image'] = settings.FDFS_BASE_URL.rstrip('/') + data['image']
                
        return data
        
    def update(self, instance, validated_data):

        """
        更新SKU图片的方法
        1. 创建Fdfs客户端
        2. 上传图片
        3. 根据上传结果进行判断,获取新图片的file_id
        4. 更新 模型的 image数据
        :param instance: SKU图片实例对象
        :param validated_data: 验证后的请求数据
        :return: 更新后的SKU图片实例对象
        """

        # 0 单独获取图片二进制数据
        image_data=validated_data.get('image').read()

        # 1. 创建Fdfs客户端
        from fdfs_client.client import Fdfs_client
        client=Fdfs_client('utils/fastdfs/client.conf')
        # 2. 上传图片到FastDFS服务器
        result=client.upload_by_buffer(image_data)
        # 3. 根据上传结果进行判断,获取新图片的file_id
        if result['Status'] != 'Upload successed.':
            raise serializers.ValidationError('上传失败,请稍后再试')

        file_id=result.get('Remote file_id')
        # 4. 更新 模型的 image数据
        instance.sku_id=validated_data.get('sku')
        instance.image=file_id
        instance.save()

        return instance


class ImageSKUModelSerializer(serializers.ModelSerializer):
    """sku序列化器"""
    class Meta:
        model=SKU
        fields=['id','name']
    